import socket

"""
单工：只能收，例如收音机
半双工：能发能收，但不能同时进行，例如对讲机
全双工：同一时间既能收也能发，socket是全双工
"""


def main():
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # 绑定ip和端口元组
    udp_socket.bind(("", 7788))
    # 目标ip和端口元组
    desc_attr = ("192.168.159.1", 8080)
    while True:
        # 功能列表
        print("--------udp聊天室--------")
        print("1、发送数据")
        print("2、接收数据")
        print("0、退出系统")
        op = input("请选择功能：")
        if op == "1":
            # 发送数据
            send_data(desc_attr, udp_socket)
        elif op == "2":
            # 接收数据
            recv_data(udp_socket)
        elif op == "0":
            break
        else:
            print("输入有误，请重新输入")
    # 关闭socket
    udp_socket.close()


def recv_data(udp_socket):
    """接收数据"""
    recv_msg = udp_socket.recvfrom(1024)
    print("%s:%s" % (str(recv_msg[1]), recv_msg[0].decode("gbk")))


def send_data(desc_attr, udp_socket):
    """发送数据"""
    send_str = input("请输入要发送的数据:")
    udp_socket.sendto(send_str.encode("gbk"), desc_attr)


if __name__ == '__main__':
    main()
